<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>执行上下文</title>
</head>
<body>
    
<!-- 
    1. 代码分类（位置）
        - 全局代码
        - 函数代码
    2. 全局执行上下文
        - 在执行全局代码前将 window 确定为全局执行上下文
        - 在全局数据进行预处理 ⭐
            1. var 定义的全局变量 --》 undefined ，添加为 window的属性
            2. function声明的全局函数 --》赋值（fun），添加为 window的方法
            3. this --》赋值（window）
            4. 开始执行全局代码
    3.  函数执行上下文
        - 在调用函数，准备执行函数体之前，创建对应的函数执行上下文对象(虚拟的，存在于栈中)
        - 在局部数据进行预处理 ⭐
            形参变量--》赋值（实参）--》添加为执行上下文的属性
            arguments--》赋值（实参列表），添加为执行上下文的属性
            var 定义的局部变量--》undefined，添加为执行上下文的属性
            function声明的函数--》赋值（fun），添加为执行上下文的方法
            this--》赋值（调用函数的对象）
        - 开始执行函数体代码
    
 -->

<script type="text/javascript">

    // 全局执行上下文
    console.log(a1,window.a1)
    a2()
    console.log(this)

    var a1 = 3
    function a2(){
        console.log('a2()')
    }
    console.log(a1)
    console.log('----------------')

    // 函数执行上下文
    function fn(a1){
        console.log(a1) // 2
        console.log(a2) // undefined
        a3()            // a3()
        console.log(this)   // window
        console.log(arguments) // 伪数组(2,3) （实参）
        var a2 = 3
        function a3(){
            console.log('a3()')
        }
    }
    fn(2,3)
</script>
</body>
</html>